package top.lishuoboy.mybatis.vo;

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.util.List;
import java.util.Map;

/** 所有字段名字与MP的Page对象保持一致 */
@Data
@NoArgsConstructor
// 自己写了构造器和setter，有特殊逻辑，防止漏洞禁止用 @AllArgsConstructor、@SuperBuilder、@Accessors(chain = true)
//@AllArgsConstructor
//@SuperBuilder
@Accessors(chain = true)   // 自己重写了setter，这个无效了
public class MyPage<T> {
    /** 当前页，默认1 */
    private int current = 1;
    /** 每页显示条数，默认10。等于0时，不查询记录，只执行count的sql计算total；小于0时，不执行分页，返回全部结果（在配置文件中开启）。查询全部结果：PageHelper需设置为0，MybatisPlus需设置为负数 */
    private int size = 10;
    /** 排序字段信息。格式id,name desc,email */
    private String orders;
    /** 是否进行 count 查询。默认为true */
    private boolean searchCount = true;
    /** 总数 */
    private long total;
    /** 当前分页总页数 */
    private int pages;
    /** 分页记录列表 */
    private List<T> records;

    /** setter。大于0才有意义，否则设置使用默认值 */
    public MyPage setCurrent(int current) {
        if (current > 0) {
            this.current = current;
        }
        return this;
    }

    /** setter。将驼峰转下划线 */
    public MyPage setOrders(String orders) {
        this.orders = orders == null ? null : StrUtil.toUnderlineCase(orders).replace("，", ",");
        return this;
    }

    /** 构造器 */
    public MyPage(int current, int size, String orders) {
        this.setCurrent(current);
        this.setSize(size);
        this.setOrders(orders);
    }

    /** 构造器 */
    public MyPage(int current, int size) {
        new MyPage(current, size, null);
    }

    /** 转 PageHelper 的 分页 对象 */
    public Map<String, Object> toPageHelper() {
        // PageHelper不从对象里获取count。所以不在这里.put("count", this.searchCount)
        return MapUtil.<String, Object>builder().put("pageNum", this.current).put("pageSize", size < 0 ? 0 : this.size).put("orderBy", this.orders).build();
    }

    /** 计算 PageHelper 的 PageSizeZero */
    public boolean toPageSizeZero() {
        return size < 0;
    }
}
